﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DAL;

namespace chess.Controllers
{
    //Класс фигура, содержит информацию о 
    //Name - типе фигуры
    //X - положении по горизонтали
    //Y - положении по вертикали
    public class ChessMan
    {
        public string Name;
        public int X;
        public int Y;
        //public ChessMan();
    }
    //Класс ход, содержит информации о
    //StartLocation - Клетке, откуда пошла фигура
    //EndLocation - Клетке, куда пошла фигура
    public class Stroke
    {
        public ChessMan StartLocation;
        public ChessMan EndLocation;
    }
    //Класс состояние доски, содержит информацию о
    //AllChessMen - положении всех фигур
    //WhoStrokeFirst - очерёдность хода(id игрока, который ходит следующим)
    //WhoPlayWhite - id игрока, играющего за белых
    public class GameState
    {
        public List<ChessMan> AllChessMen;
        public string WhoStrokeFirst;
        public string WhoPlayWhite;
        //public GameState(){}
    }
    //Класс информация об игре, содержит инфо
    //
    public class GameInfo
    {
        public string GameId;
        public DateTime GameStartTime;
        public string FirstGamer;
        public string FirstGamerColor;
        public string SecondGamer;
        //public GameInfo(){}
    }

    public class ChessController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        //Gamer
        #region
        //Регистрация нового пользователя
        //login - логин
        //password - пароль
        //name - имя
        public ActionResult CreateNewGamer(string login, string password, string name)
        {
            try
            {
                DAL.Gamer NewGamer = new Gamer();
                List<DAL.Gamer> NewGamerList = new List<Gamer>();
                //получим лист игроков по лигину
                var tempGamerList = NewGamer.Search_Gamers(login, "", "", "");
                //NewGamerList = NewGamer.Search_Gamers(login, "", "", "");
                if (NewGamerList.Count != 0)
                    return Json("LoginUnUnique", JsonRequestBehavior.AllowGet);
                else
                {
                    //если нет совпадений
                    NewGamer = new Gamer(login, password, 0, name);
                    return Json("RegistrationCompleted", JsonRequestBehavior.AllowGet);
                }
            }
            catch (Exception e)
            {
                return Json("Error300", JsonRequestBehavior.AllowGet);
            }
        }

        //Вход пользователя в систему
        //login - логин
        //password - пароль
        public ActionResult LogInGamer(string login, string password)
        {
            try
            {
                DAL.Gamer NewGamer = new Gamer();
                List<DAL.Gamer> NewGamerList = new List<Gamer>();
                //получим лист игроков по лигину и паролю
                NewGamerList = NewGamer.Search_Gamers(login, password, "", "");
                if (NewGamerList.Count != 1)
                    return Json("Login/PasswordWrong", JsonRequestBehavior.AllowGet);
                else
                    //если есть только один найденный игрок
                    return Json("LogInCompleted", JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json("Error300", JsonRequestBehavior.AllowGet);
            }
        }

       
        #endregion

        //Game
        #region


        //Получить список активных игр игрока
        //login - логин
        public ActionResult GetActualGames(string login)
        {
            try
            {
                GameInfo GameInfo = new GameInfo();
                List<GameInfo> GameInfoList = new List<GameInfo>();
                DAL.Gamer NewGamer = new Gamer();
                List<DAL.Game> ActualGameList = new List<Game>();
                //Получим список игр игрока Login
                //ActualGameList = NewGamer.get_game_list_for_gamer(login);
                foreach (DAL.Game g in ActualGameList)
                {
                    GameInfo.GameId = g.Game_ID.ToString();
                    GameInfo.GameStartTime = g.Get_Game_info(g.Game_ID).start_time;
                    GameInfo.FirstGamer = g.Get_Game_info(g.Game_ID).gamer1_login;
                    GameInfo.SecondGamer = g.Get_Game_info(g.Game_ID).gamer1_login;
                    GameInfo.FirstGamerColor = g.Get_Game_info(g.Game_ID).gamer1_login;
                    GameInfoList.Add(GameInfo);
                }
                return Json(GameInfoList, JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json("Error300", JsonRequestBehavior.AllowGet);
            }
        }
        //Создать новую игру
        //login - уникальный идентификатор пользователя, создавшего игру
        public ActionResult CreateNewGame(string login)
        {
            try
            {
                //Заполняем информацию об игроке, начавшем игру
                DAL.Game newGame = new Game(1, login, "", "White", "", 0, 0, 0, 0, DateTime.UtcNow);
                return Json(newGame.Game_ID, JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json("Error300", JsonRequestBehavior.AllowGet);
            }
        }
  
        //Отправить вызов игроку
        //gamer1ID - уникальный идентификатор пользователя, отправившего вызов
        //gamer2ID - уникальный идентификатор пользователя - получателя
        //gameID - уникальный идентификатор игры
        public ActionResult SendChallenge(string gamer1ID, string gamer2ID, string gameID)
        {
            ////Отправим запрос игроку gamer2ID
            //if(DAL.Game.Send_Challenge(gamer1ID, gamer2ID, gameID))
            //    return Json("ChallengeSend", JsonRequestBehavior.AllowGet);
            //else
            //    return Json("Error", JsonRequestBehavior.AllowGet);
            return Json("ok", JsonRequestBehavior.AllowGet);
        }

        //Принять вызов игрокa
        //gameID - уникальный идентификатор игры
        //gamer1ID - уникальный идентификатор пользователя, отправившего вызов
        //gamer2ID - уникальный идентификатор пользователя - получателя
        public ActionResult AcceptChallenge(string gamer1ID, string gamer2ID, string gameID)
        {
            ////Обновим информацию об игре, добавим второго игрока
            //if(DAL.Game.Set_Game_Info(gameID, gamer1ID, gamer2ID, ""))
            //    return Json("ChallengeAccepted", JsonRequestBehavior.AllowGet);
            //else
            //    return Json("Error", JsonRequestBehavior.AllowGet);
            return Json("ok", JsonRequestBehavior.AllowGet);
        }

        //Отменить вызов игроку / Отклонить вызов игрокa / Удилить игру
        //gameID - уникальный идентификатор игры
        //login - уникальный идентификатор игрока, который хочет закончить игру
        public ActionResult DeleteGame(string login, string gameID)
        {
            try
            {
                Game newGame = new Game();
                Gamer newGamer = new Gamer();
                List<Gamer> newGamerList = new List<Gamer>();
                //Ищем игрока
                newGamerList = newGamer.Search_Gamers(login, "", "", "");
                //Уменьшаем ему рейтинг на 1
                if (newGamerList.Count == 1)
                    newGamerList[0].Set_Rating(login, newGamerList[0].Get_Rating(login) - 1);
                //Удалим игру
                newGame.Delete_Game(Convert.ToInt32(gameID));
                return Json("GameEnded", JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json("Error300", JsonRequestBehavior.AllowGet);
            }
        }

        //Сохранить состояние игры
        //gameID - уникальный идентификатор игры
        public ActionResult SaveGame(string gameID)
        {
            ////gameState - состояние игры (положение фигур, стороны игроков, очерёдность хода)
            //DAL.GameState gameState = new DAL.GameState();
            ////Получим состояние игры
            //gameState = DAL.Game.Get_Game_State(gameID);
            ////Сохраним игру
            //if (DAL.Game.Save_Game_State(gameState))
            //    return Json("GameSaved", JsonRequestBehavior.AllowGet);
            //else
            //    return Json("Error", JsonRequestBehavior.AllowGet);
            return Json("ok", JsonRequestBehavior.AllowGet);
        }

        //Загрузить состояние игры
        //gameID - уникальный идентификатор игры
        public ActionResult LoadGame(string gameID)
        {
            ////gameState - состояние игры (положение фигур, стороны игроков, очерёдность хода)
            //DAL.GameState gameState = new DAL.GameState();
            ////serializebleGameState - состояние игры сохранённое в экземпляре сериализуемого класса
            //GameState serializebleGameState = new GameState();
            ////ms - состояние игры, преобразованное в строку
            //MemoryStream ms = new MemoryStream();
            ////Получим состояние игры
            //gameState = DAL.Game.Get_Game_State(gameID);
            ////Приведём к сериализуемому виду
            //serializebleGameState = DAL.Game.Get_Serializeble_State(gameState);
            ////Инициируем сериализатор
            //DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(GameState));
            ////Запишем сериализованные данные в поток
            //ser.WriteObject(ms, serializebleGameState);
            ////Загрузим игру
            //return Json(ms, JsonRequestBehavior.AllowGet);
            return Json("ok", JsonRequestBehavior.AllowGet);
        }
        #endregion

        //Stroke
        #region
        //Можно ли сделать ход?
        //gameID - уникальный идентификатор игры
        //gamerID - уникальный идентификатор игрока
        public ActionResult CheckStroke(string gameID, string gamerID)
        {
            ////gameState - состояние игры (положение фигур, стороны игроков, очерёдность хода)
            //DAL.GameState gameState = new DAL.GameState();
            ////Получим состояние игры
            //gameState = DAL.Game.Get_Game_State(gameID);
            ////проверим, наш ли ход
            //if(gameState.Next_Stroke == gamerID)
            //    return Json("OurStroke", JsonRequestBehavior.AllowGet);
            //else
            //    return Json("EnemyStroke", JsonRequestBehavior.AllowGet);
            return Json("ok", JsonRequestBehavior.AllowGet);
        }

        //Делаем ход
        //gameID - уникальный идентификатор игры
        //gamerID - уникальный идентификатор игрока
        //stroke - строка содержащая сериализованный экземпляр класса Stroke
        public ActionResult Stroke(string gameID, string gamerID, string stroke)
        {
            ////s - экземпляр класса Stroke, содержащий информацию о ходе
            //Stroke s = new Stroke();
            ////Инициируем сериализатор
            //DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(GameState));
            ////Конвертируем строку в MemoryStream
            //var ms =  new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(stroke));
            ////Десериализуем строку хода
            //s = (Stroke)ser.ReadObject(ms);
            ////Делаем ход
            //if(DAL.Stroke.Set_Strouke(s.StartLocation.Name, s.StartLocation.X, s.StartLocation.Y, s.EndLocation.Name, s.EndLocation.X, s.EndLocation.Y))
            //    return Json("StrokeDone", JsonRequestBehavior.AllowGet);
            //else
            //    return Json("Error", JsonRequestBehavior.AllowGet);
            return Json("ok", JsonRequestBehavior.AllowGet);
        }

        //Проверяем, не сходил ли противник
        //gameID - уникальный идентификатор игры
        //gamerID - уникальный идентификатор игрока
        public ActionResult ViewStroke(string gameID, string gamerID)
        {
            ////lastStroke - Информация о последнем ходе
            //DAL.Stroke lastStroke;
            ////s - экземпляр класса Stroke, содержащий информацию о ходе
            //Stroke s = new Stroke();
            ////Получим последний ход
            //lastStroke = DAL.Stroke.Get_Last_Stroke(gameID);
            ////Узнаем чей был ход
            //if (lastStroke.Get_Gamer_Id() == gamerID)
            //    return Json("w8", JsonRequestBehavior.AllowGet);
            //else
            //{
            //    //Сериализуем ход
            //    s = DAL.Stroke.Get_Serializeble_Stroke(lastStroke);
            //    //Инициируем сериализатор
            //    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Stroke));
            //    //ms - состояние игры, преобразованное в строку
            //    MemoryStream ms = new MemoryStream();
            //    //Запишем сериализованные данные в поток
            //    ser.WriteObject(ms, s);
            //    //Загрузим игру
            //    return Json(ms, JsonRequestBehavior.AllowGet);
            //}
            return Json("ok", JsonRequestBehavior.AllowGet);
        }
        #endregion


        //Лишние
        #region
        //Напишем сообщение в чат
        //gamerID - уникальный идентификатор игрока
        //text - текст сообщения
        public ActionResult PostMessage(string gamerID, string text)
        {
            ////MessageId - уникальный индекс сообщения
            //string MessageId;
            ////Сохраним сообщение
            //MessageId = DAL.Social_Network.Add_New_Message(gamerID, text);
            //if(MessageId!="")
            //    return Json(MessageId, JsonRequestBehavior.AllowGet);
            return Json("ok", JsonRequestBehavior.AllowGet);
        }

        //ПРочитаем сообщение из чата
        //LastMessageID - уникальный идентификатор сообщения
        public ActionResult ReadMessage(string LastMessageID)
        {
            ////MessageId - уникальный индекс сообщения
            //string MessageId;
            ////text - текст сообщения
            //string text;
            ////Узнаем индекс последнего сообщения
            //MessageId = DAL.Social_Network.Get_Last_Message_Id();
            //if (MessageId == LastMessageID)
            //    return Json("w8", JsonRequestBehavior.AllowGet);
            //else
            //{
            //    //Прочитаем текст последнего сообщения
            //    text = DAL.Social_Network.Get_Last_Message_Text();
            //    return Json(text, JsonRequestBehavior.AllowGet);
            //}
            return Json("ok", JsonRequestBehavior.AllowGet);
        }
        #endregion
    }

}
